package com.demo.runnable_;

/**
 * @author gy
 * @date 2022/4/20
 */
public class Runnable01 {
    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        ThreadProxy threadProxy = new ThreadProxy(tiger);
        threadProxy.start();
    }
}


class Animal{}

class Tiger extends Animal implements Runnable{
    int count;
    @Override
    public void run() {
        while (true) {
            System.out.println("老虎在 叫~~~~~~~~~" + count++);
            try {
                Thread.sleep(1000);
                if(count == 10){
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

/**
 * 线程代理类，模拟了一个极简的Thread类
 * 因为 Runnable 接口中并没有 start方法，但是 Thread中有，采用代理模式
 * 不过最终走的 run方法，还是 Runnable的子类
 */
class ThreadProxy implements Runnable{

    private Runnable target = null;

    public ThreadProxy(Runnable target) {
        this.target = target;
    }

    @Override
    public void run() {
        if(target != null){
            target.run(); // 进行动态绑定（运行类型 Tiger）
        }
    }

    public void start(){
        // 这个方法是最重要的，是真正实现多线程的方法
        start0();
    }

    public void start0(){
        // 还有很多的内容，此处 省略...
        run();
    }
}